home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
UUCP
/
UUCon
/
Source
/
ConController.m
< prev
next >
Wrap
Text File
|
1994-05-23
|
9KB
|
390 lines
/*
Ronin Consulting, Inc.
Copyright (C) 1992, Nicholas Christopher (nwc@gun.com)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#import "version.h"
#import "Defaults.h"
#import "EnhancedText.h"
#import "EnhancedApp.h"
#import "Subprocess.h"
#import "ConController.h"
#import "LogController.h"
#import "InfoController.h"
#import "SweepView.h"
#import <appkit/appkit.h>
#import <string.h>
static char tempFile[30] = "/tmp/.UUCon.XXXXXX";
static void sweepIncrement(DPSTimedEntry teNumber, double now, void *userData);
@interface ConController (PRIVATE) /* Private methods */
-_startSweep;
-_endSweep;
@end
@implementation ConController
- init
{
[super init];
[NXApp appDirectory]; /* cd to Apps directory so files in wrapper can be found */
defaults = [Defaults new];
teNum = (DPSTimedEntry)0;
procType = NO_SPROC;
logfile = syslog = nil;
return self;
}
- pollHost:sender
{
const char *host = [hostsPopUp title];
char buff[80 + strlen(host)];
if(procType != NO_SPROC)
return self;
sprintf(buff,"Polling host: %s\n", host);
[consoleLog appendString: buff];
[self _startSweep];
if(*[defaults get: "DebugPoll"] == 'Y' && !auditProc)
{
auditFile = mktemp(tempFile); /* build a temporary audit file */
sprintf(buff,"/usr/lib/uucp/uucico -r1 -s%s -x9 2> %s", host, auditFile);
}
else
{
[consoleLog appendString: "\nStarting to Poll - check log tool to watch progress\n"];
sprintf(buff,"uupoll %s", host);
}
procType = POLL_HOST;
subProc = [[Subprocess alloc] init: buff withDelegate: self];
if(*[defaults get: "DebugPoll"] == 'Y')
{
sprintf(buff, "tail -f %s", auditFile);
auditProc = [[Subprocess alloc] init: buff withDelegate: self];
}
return self;
}
- getBPS: sender
{
char cmd[512] = "tail -14 /usr/spool/uucp/SYSLOG | fgrep bytes | \
awk '/failed/ { printf \" %8d bytes %8s (%8s) in %7.2f sec FAILED\\n\",\
$7, $5, $2, $9 } \
{ if ( $7 > 100 && ($9 + 0) > 0) \
{ bytes += $7; seconds += $9; \
printf \"%8d bytes %8s(%s) in %7.2f\\n\", $7, $5, $2, $9}} \
END { printf \"\\nAvg %8.2f bps\\n\", (bytes/seconds) * 8 }'";
if (procType != NO_SPROC)
return self;
[self _startSweep];
[consoleLog appendString: "Speed of last 7 jobs\n"];
procType = GET_BPS;
subProc = [[Subprocess alloc] init: cmd withDelegate: self];
return self;
}
- hostsQueue:sender
{
const char *host = [hostsPopUp title];
char buff[80 + strlen(host)];
if(procType != NO_SPROC)
return self;
[self _startSweep];
sprintf(buff,"Queue for host: %s\n", host);
[consoleLog appendString: buff];
sprintf(buff,"uuq -l -s%s -b%s", host, [defaults get: "BaudRate"]);
procType = HOST_QUEUE;
subProc = [[Subprocess alloc] init: buff withDelegate: self];
return self;
}
- hostsSnap:sender
{
if(procType != NO_SPROC)
return self;
[self _startSweep];
[consoleLog appendString: "Snapshot of uucp hosts\n"];
procType = SNAP_HOSTS;
subProc = [[Subprocess alloc] init: "uusnap" withDelegate: self];
return self;
}
- setConsoleLog:sender
{
consoleLog = [sender docView];
return self;
}
- deleteJob:sender
{
const char *host = [hostsPopUp title];
const char *job = [consoleLog selectedText];
char buff[80 + strlen(host) + strlen(job)];
if(procType != NO_SPROC)
return self;
[self _startSweep];
sprintf(buff,"Deleting job %s for host: %s\n", job, host);
[consoleLog appendString: buff];
sprintf(buff, "uuq -s%s -d%s", host, job);
procType = DELETE_JOB;
subProc = [[Subprocess alloc] init: buff withDelegate: self];
return self;
}
- keyWindowLogClear: sender
{
id keyController = [[NXApp keyWindow] delegate];
if([keyController respondsTo: @selector(logClear)])
[keyController logClear];
return self;
}
- logClear
{
[consoleLog empty: self];
return self;
}
- syslog: sender
{
if(!syslog)
syslog = [[LogController alloc] initForCommand: "tail -10f /usr/spool/uucp/SYSLOG" entitled: "SYSLOG" ];
[syslog makeKeyAndOrderFront: self];
return self;
}
- logfile: sender
{
if(!logfile)
logfile = [[LogController alloc] initForCommand: "tail -10f /usr/spool/uucp/LOGFILE" entitled: "LOGFILE" ];
[logfile makeKeyAndOrderFront: self];
return self;
}
@end /* ConController */
@implementation ConController (PRIVATE)
-_startSweep
{
[progress setIntValue: 0];
teNum = DPSAddTimedEntry(.02, sweepIncrement, &progress, NX_RUNMODALTHRESHOLD + 1);
return self;
}
-_endSweep
{
if(teNum)
{
DPSRemoveTimedEntry(teNum);
teNum = (DPSTimedEntry)0;
}
[progress setIntValue: -1];
// [progress display];
return self;
}
@end /* ConController (PRIVATE) */
@implementation ConController (ApplicationDelegate)
- appDidInit:sender
{
/* if this program is set gid to daemon and L.sys is group readable to same we can debug */
setgid(getegid());
[infoController setVersionValue: version];
procType = BUILDING_MENU;
subProc = [[Subprocess alloc] init: "uuname" withDelegate: self];
[progress setIntValue: -1];
[progress setStepSize: 10];
return self;
}
- appWillTerminate:sender
{
if(procType != NO_SPROC)
[subProc free];
if(auditProc)
[auditProc free];
if(logfile)
[logfile free];
if(syslog)
[syslog free];
return self;
}
@end /* ApplicationDelegate */
@implementation ConController (SubprocessDelegate)
- subprocess:sender done:(int)exitStatus
{
switch(procType)
{
case BUILDING_MENU:
[[hostsPopUp target] removeItem: [hostsPopUp title]];
[hostsPopUp setTitle: [[[[hostsPopUp target] itemList] cellAt:0:0] title]];
/* choose the default host if one set */
if([[hostsPopUp target] indexOfItem: [defaults get: "DefaultHost"]] != -1)
[hostsPopUp setTitle: [defaults get: "DefaultHost"]];
[consoleLog appendString: "Ready to go.\n"];
if(*[defaults get: "ShowLog"] == 'Y')
[self logfile: self];
if(*[defaults get: "ShowSysLog"] == 'Y')
[self syslog: self];
[window makeKeyAndOrderFront: self];
break;
case HOST_QUEUE:
[consoleLog appendString: "\nQueue Complete\n"];
break;
case SNAP_HOSTS:
[consoleLog appendString: "\nSnapshot Complete\n"];
break;
case POLL_HOST:
if(auditProc)
{
[consoleLog appendString:"\nDebug Poll done.\n"];
[NXApp delayedFree: auditProc];
auditProc = nil;
unlink(auditFile);
}
break;
case DELETE_JOB:
[consoleLog appendString: "\nDelete Complete\n"];
break;
case GET_BPS:
[consoleLog appendString: "\nSpeed Listing Complete.\n"];
break;
case NO_SPROC:
return self; /* don't want to free unknown */
break;
}
if(sender == subProc)
{
procType = NO_SPROC;
[self _endSweep];
}
[NXApp delayedFree: sender];
return self;
}
- subprocess:sender output:(char *)buffer
{
[progress increment: self];
switch(procType)
{
case BUILDING_MENU:
[[hostsPopUp target] addItem: buffer];
break;
default:
[consoleLog appendString: buffer];
[consoleLog appendString: "\n"];
break;
}
return self;
}
- subprocess:sender stderrOutput:(char *)buffer
{
[progress increment: self];
[consoleLog appendString: buffer];
return self;
}
- subprocess:sender error:(const char *)errorString
{
[consoleLog appendString: "Failed to create subprocess.\n"];
return self;
}
@end
void sweepIncrement(DPSTimedEntry teNumber, double now, void *userData)
{
[*(id *)userData increment: nil];
}